Date		:	17/5/94 + 24-25/06/94
		Protection	:	MOT DE PASSE
		Programme	:       GENESIA
		Outils		:	SOFT-ICE V2.50 + V2.64 avec EMS
		Fichier		:	GENESIA.EXE
		Temps pass�	:	25mn + 1h
		Soci�t�		:	Micro�ds
		Origine		:	C.D.
		Divers	        :	pr�trait� par STACK RIPPER
		Num�ro		:	247


	En hommage � STACK RIPPER je laisse ici son essai de crackage. Ce
	dernier fonctionne lors de la demande du mot de passe initial mais
	ne fonctionne plus lors de la seconde demande apr�s avoir restaur�
	un fichier sauvegard�.

  �	  Pas vraiment difficile. Il m'a suffit de tracer le programme (et
  �	sp�cialement la routine de code), de la remonter pour arriver au
  �	CALL responsable de l'affichage de la demande du code , et d'interver-
  �	tir le saut d'apr�s. Bon mon p�re souhaite que je m'�tale un peu plus
  �	donc je vais d�tailler ce crack. Apr�s l'appel de Soft-Ice, on se
  �	trouve dans un longue boucle se terminant par un test de la touche
  �	ENTREE (0D). On la quitte par un RETF et quelques instructions plus
  �	tard, on parvient � un test de AX, puis forc�ment � un saut qui, si
  �	le joueur � mal r�pondu au bout de 3 essais renvoie ce dernier au
  �	DOS. C'est ce saut qu'il faut inverser (ou plut�t forcer). Voici
  �	donc pour la version 640*480 :
  �
  �		15F9:010C	7503	JNZ	0111	--> devient JMP 0111
  �
  �	Et pour la version 320*200 (c'est la m�me routine, mot pour mot, mais
  �	le fichier EXE est plus court, donc le saut de trouve avant) :
  �
  �		15F9:00E5	7503	JNZ	00EA	--> devient JMP 00EA
  �
  �	STACK RIPPER


	Lorsque l'inversion d'un saut ne donne pas l'effet escompter il faut
	trouver ce qui agit sur le saut. En l'occurence le contenu de AX et
	comment celui-ci est d�termin�. 
	Apr�s diff�rents essais il semble que ce n'est pas suffisant. J'ai donc
	d�cid� de remonter � la source du probl�me.

	Apr�s avoir activer la touche ENTER test�e en CS:16F4

		CS=4BB2
		CS:16F4 807EFC0D	CMP	BYTE PTR [BP-04],0D
		CS:16F8 7403		JZ	16FD

	on trouve un CALL qui doit probablement test� le code entr� avec 
	celui se trouvant en m�moire. Mais en tra�ant ce CALL on ne trouve
	rien.
	
	Il ne reste plus que de faire un point d'arr�t au moment o� le
	programme lit le code entr� pour le comparer avec celui se trouvant
	dans le programme.

	Mais on ne sait pas o� se trouve le code que l'on vient de taper.
	Il existe deux m�thodes pour le trouver.

	-1) Mettre un point d'arr�t sur le port du clavier et regarder o� le
	    programme va mettre l'octet tap�. C'est fastidieux surtout qu'�
	    ce niveau le caract�re est un SCAN-CODE et n'est pas en ASCII.

	-2) Faire une recherche de la chaine tap�e avec tous les segments
	    ( donn�es, ES, SS et m�me CS d�s fois qu'un programmeur vicieux
	    aurait plac� les donn�es dans le code ). Pour cel� il faut taper
	    une chaine facilement identifiable telle que FREDDY par-exemple.

	Avec S DS:0 L FFFF 'FREDDY' pour les 64k du segment de donn�es.
	Avec S ES:0 L FFFF 'FREDDY' pour les 64k de l'extra-segment.
	Avec S SS:0 L FFFF 'FREDDY' pour les 64k du segment du stack.
	etc...

	Et en g�n�ral on trouve.

	Dans le cas pr�sent la chaine est en: ES:1FE0. Il ne suffit plus que de
	mettre un point d'arr�t sur la position ES:1FE0 en lecture pour trouver
	les instructions de comparaisons et o� se trouve la chaine � comparer.

	BPMB ES:1FE0 R

	D�s lors on trouve les instructions de comparaisons suivantes qui se
	trouve dans la m�me routine qui checke la demande de code au d�but du
	jeu que celle qui demande en cliquant sur la caserne blanche dans une
	sauvegarde:

	CS=306E
	CS:0012 B9FFFF	MOV	CX,FFFF
	CS:0015 F2AE	REPNZ	SCASB	; Cherche tant que # de AX sinon quitte.
	CS:0017 F7D1	NOT	CX	; Cx contient la taille du mot.
	CS:0019 2BF9	SUB	DI,CX	; On se repositionne au d�but pour...
	CS:001B F3A6	REPZ	CMPSB	; ...comparer la chaine et on quitte 
					  si pas �gal ou si CX=0.

	Nota: Ces instructions sont compl�tement d�taill�es par SOURCER � la
	fin de ce DEP.

	La chaine tap�e se trouve comme suit dans ES:DI  FREDDY..............
	La chaine du SOFT se trouve comme suit en DS:SI  MORAL.MONDE.LAC.DEST

	Une petite explication: Les mots ne sont pas s�par�s par des points
	mais par le caract�re NUL=00. PCTOOLS affiche un point lorsque le
	caract�re n'est pas affichable, caract�re de control, retour ligne,
	line feed, etc. Donc l'instruction REPNZ ( r�p�te tant que CX#0 )
	SCASB ( recherche dans une chaine le caract�re qui se trouve dans
	AX ) Ici on a NUL dans AX soit 0000. Donc CX qui �tait � FFFF se trouve
	par exemple � FFFA si le mot �tait "MORAL.". En faisant un NOT CX on
	inverse son contenu et on trouve F-A=5 lettres. Donc CX contenant 5 on
	va comparer maintenant ces 5 caract�res avec REPZ CMPSB ( compare
	string byte ). Au fait ce programme semble avoir �t� �crit en C.

	Alors ici il y a plein de solutions, mais la plus simple est d'aller
	voir avec PCTOOLS si les chaines � comparer ne sont pas en clair dans
	le SOFT ! Si si �a arrive.

	Et je te le donne en mille. Elles sont en CLAIR dans le fichier
	GENESIA.EXE !

	Il ne reste plus que de remplacer les 50 mots de passe structur�s comme
	suit:

	MORAL.MONDE.LAC.DESTINATION.CONSTRUIRE.etc.etc.etc.

	Par des zeros comme suit ( des zeros en ASCII �videmment ):

	0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.

	Ce qui donne en HEXA:

	30 00 30 00 30 00 30 00 30 00 30 00 30 00 30 00 etc...

	Et rajouter lors de la demande de mot de passe ( puisqu'elle est en
	clair ) un message expliquant qu'il suffit de taper 0 et ENTER !

	Les copies d'�cran ci-apr�s ont �t� faites avec CET.COM:
	Ci-dessous le secteur original du texte accompagnant la demande du mot
	de passe. Et plus loin le m�me texte modifi�.

     GENESIA.EXE Secteur Relatif 0000368 Groupe 38383 Sect rel disk 0614535

  0032   56 34 3E 27 4D 41 4C 47 52 45 20 56 4F 53 20 51   V4>'MALGRE VOS Q
  0048   55 41 4C 49 54 45 53 20 43 45 52 54 41 49 4E 45   UALITES CERTAINE
  0064   53 20 45 54 20 4C 41 20 43 4F 4E 46 49 41 4E 43   S ET LA CONFIANC
  0080   45 00 51 55 45 20 56 4F 55 53 20 41 43 43 4F 52   E QUE VOUS ACCOR
  0096   44 45 20 4C 41 20 50 4F 50 55 4C 41 54 49 4F 4E   DE LA POPULATION
  0112   20 44 45 20 47 45 4E 45 53 49 41 2C 00 43 45 52    DE GENESIA, CER
  0128   54 41 49 4E 53 20 44 4F 55 54 45 4E 54 20 51 55   TAINS DOUTENT QU
  0144   45 20 56 4F 55 53 20 53 4F 59 45 5A 20 4C 27 48   E VOUS SOYEZ L'H
  0160   45 52 49 54 49 45 52 00 44 45 20 4C 27 41 4E 43   ERITIER DE L'ANC
  0176   49 45 4E 20 50 52 49 4E 43 45 2E 20 50 4F 55 52   IEN PRINCE. POUR
  0192   20 4C 45 53 20 52 41 53 53 55 52 45 52 2C 00 49    LES RASSURER, I
  0208   44 45 4E 54 49 46 49 45 5A 20 56 4F 54 52 45 20   DENTIFIEZ VOTRE
  0224   56 45 52 53 49 4F 4E 20 43 4F 4D 4D 45 20 45 54   VERSION COMME ET
  0240   41 4E 54 20 00 55 4E 20 4F 52 49 47 49 4E 41 4C   ANT  UN ORIGINAL
  0256   2E 00 44 4F 4E 4E 45 5A 20 4C 45 20 50 52 45 4D   . DONNEZ LE PREM
  0272   49 45 52 20 4D 4F 54 00 50 41 47 45 3A 20 20 20   IER MOT PAGE:
                                                                                
  0048   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    
  0064   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    
  0080   20 00 20 20 20 20 20 20 20 46 52 45 44 44 59 5F            FREDDY_ 
  0096   53 4F 54 20 45 54 20 53 54 41 43 4B 20 52 49 50   SOT ET STACK RIP
  0112   50 45 52 20 20 20 20 20 20 20 20 20 00 20 53 4F   PER           SO
  0128   4E 54 20 46 49 45 52 53 20 44 45 20 56 4F 55 53   NT FIERS DE VOUS
  0144   20 50 52 45 53 45 4E 54 45 52 20 43 45 20 4C 4F    PRESENTER CE LO
  0160   47 49 43 49 45 4C 20 00 20 20 20 20 20 20 20 53   GICIEL         S
  0176   41 4E 53 20 41 55 43 55 4E 45 20 50 52 4F 54 45   ANS AUCUNE PROTE
  0192   43 54 49 4F 4E 2E 20 20 20 20 20 20 20 20 00 20   CTION.          
  0208   20 20 20 20 4A 55 53 54 45 20 54 41 50 45 5A 20       JUSTE TAPEZ 
  0224   5A 45 52 4F 20 45 54 20 45 4E 54 45 52 2E 20 20   ZERO ET ENTER.  
  0240   20 20 20 20 00 20 20 20 20 20 20 20 20 20 20 20                   
  0256   20 00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 
       
	En fait apr�s avoir cogit� un petit moment je me suis dit:
	"Et si je sauvais les octets dans un fichier binaire lorsque je
	 trouve un hit avec mon HEXUTIL afin de les dessassembler avec
	 SOURCER ?".
	Aussitot dit aussitot fait. Et voil� ci-dessous le r�sultat:

  CS:0000  B9 FFFF	mov	cx,0FFFFh
  CS:0003  F2/ AE	repne	scasb	   ; Rep zf=0+cx >0 Scan es:[di] for al
  CS:0005  F7 D1	not	cx
  CS:0007  2B F9	sub	di,cx
  CS:0009  F3/ A6	repe	cmpsb	   ; Rep zf=1+cx >0 Cmp [si] to es:[di]
  CS:000B  74 06	jz	loc_2	   ; Jump if zero
  CS:000D  1B C0	sbb	ax,ax
  CS:000F  F5		cmc		   ; Complement carry
  CS:0010  15 0000	adc	ax,0
  CS:0013  8E DA loc_2:	mov	ds,dx      ;  xref CS:000B
  CS:0015  5F		pop	di
  CS:0016  5E		pop	si
  CS:0017  CB		retf
	
	La valeur de IP est fausse mais on s'en fout car de toute fa�on on le
	connait car on a trac� le programme jusqu'� cet endroit. Et d'autre
	part c'est juste pour avoir des commentaires sur le code et pouvoir les
	placer dans les DEPs.

	Freddy